Prefetching is a caching technique used for improving the performance of memory systems. Caching increases performance by keeping copies of accessed data, in the hope that the cached data will be accessed again sometime relatively soon thereafter. Prefetch systems usually have to identify what data to prefetch, the circumstances under which the prefetch should occur, and the length of time to cache the prefetched data. If the wrong data is prefetched, no accesses to the data will occur and no performance improvements will be realized. Likewise, if the right data is fetched at the wrong time, it may be replaced by other caching data before being accessed. Incorrectly specifying the “keep time” will have a similar effect.
In many computer architectures different devices, applications, or elements request data from the same memory system. The memory accesses from these different devices and applications can also be abstracted by other devices or elements. For example, an operating system may break a read request from a software application into a plurality of different individual read operations. Memory access requests from different sources and the abstractions made by other processing elements make it extremely difficult to correctly identify memory access patterns and provide effective prefetching.